#! /bin/bash
DEMAIN=''
CA_DIR="/home/CA" #不要有反斜杆
while true; do
    read -p "请输入域名：" domain
    if [ -z "$domain" ]; then
        echo "输入的域名不能为空"
    else
        DEMAIN=$domain
        break;
    fi
done
if [ ! -d "${CA_DIR}" ]; then
    mkdir $CA_DIR -p
fi
# 第一步创建CA私钥
openssl genrsa -out "${CA_DIR}/root-ca.key" 4096
# 利用私钥创建 CA 根证书请求文件
# -subj 参数里的 /C 表示国家，如 CN；/ST 表示省；/L 表示城市或者地区；/O 表示组织名；/CN 通用名称
openssl req -new -key "${CA_DIR}/root-ca.key" -out "${CA_DIR}/root-ca.csr" -sha256 -subj "/C=CN/ST=Shanxi/L=Datong/O=公司名称/CN=Your Company Name Docker Registry CA"
#配置 CA 根证书，新建 root-ca.cnf
if [ ! -f "${CA_DIR}/root-ca.cnf" ]; then
cat>${CA_DIR}/root-ca.cnf <<END
[root_ca]
basicConstraints = critical,CA:TRUE,pathlen:1
keyUsage = critical, nonRepudiation, cRLSign, keyCertSign
subjectKeyIdentifier=hash
END
fi
# 签发根证书
openssl x509 -req  -days 3650  -in "${CA_DIR}/root-ca.csr" -signkey "${CA_DIR}/root-ca.key" -sha256 -out "${CA_DIR}/root-ca.crt" -extfile "${CA_DIR}/root-ca.cnf" -extensions root_ca
# 生成站点SSL私钥  
openssl genrsa -out "${CA_DIR}/${DEMAIN}.key" 4096
# 使用私钥生成证书请求文件
openssl req -new -key "${CA_DIR}/${DEMAIN}.key" -out "${CA_DIR}/site.csr" -sha256 -subj "/C=CN/ST=Shanxi/L=Datong/O=Your Company Name/CN=${DEMAIN}"
# 新建文件
if [ ! -f "${CA_DIR}/site.cnf" ]; then
cat>${CA_DIR}/site.cnf <<END
[server]
authorityKeyIdentifier=keyid,issuer
basicConstraints = critical,CA:FALSE
extendedKeyUsage=serverAuth
keyUsage = critical, digitalSignature, keyEncipherment
subjectAltName = DNS:${DEMAIN}, IP:127.0.0.1
subjectKeyIdentifier=hash
END
fi
# 签署站点SSL证书
openssl x509 -req -days 3650 -in "${CA_DIR}/site.csr" -sha256 -CA "${CA_DIR}/root-ca.crt" -CAkey "${CA_DIR}/root-ca.key"  -CAcreateserial -out "${CA_DIR}/${DEMAIN}.crt" -extfile "${CA_DIR}/site.cnf" -extensions server
# 删除无效临时文件
rm -rf ${CA_DIR}/root-ca.cnf ${CA_DIR}/root-ca.csr ${CA_DIR}/root-ca.key ${CA_DIR}/root-ca.srl ${CA_DIR}/site.cnf ${CA_DIR}/site.csr
